package version2024.medium;

import java.util.Scanner;

/**
 * @author sunhl
 * @Description: HJ33 整数与IP地址间的转换  字符串, 模拟, Long和Integer的API
 * @Date: created in 2024/12/29 星期日 17:18
 * @Modified By:
 */
public class HJ33_IntegerIPAddressConversion {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String s = in.next();
            if (s.contains(".")) {
                System.out.println(ip2num(s));
            } else {
                System.out.println(num2ip(s));
            }
        }
    }

    // ip转换为10进制
    public static long ip2num(String ip) {
        // 按.分割数组
        String[] iip = ip.split("\\.");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            // 转换成int
            int num = Integer.parseInt(iip[i]);
            // 转换成二进制
            String num2 = Integer.toBinaryString(num);
            // 总长8位, 不够补0
            while (num2.length() < 8) {
                num2 = "0" + num2;
            }

            sb.append(num2);
        }
        // 转化为10进制, 第二个参数指定待转换数的进制
        return Long.parseLong(sb.toString(), 2);
    }

    // 10进制数转换为ip
    public static String num2ip(String ip) {
        // 输入的内容转换为long
        long num1 = Long.parseLong(ip);
        // long转换为二进制
        String num2 = Long.toBinaryString(num1);
        // 不够32位补0
        while (num2.length() < 32) {
            num2 = "0" + num2;
        }

        String[] iip = new String[4];
        for (int i = 0; i < 4; i++) {
            // 按8位一段做截取, substring左闭右开
            String s = num2.substring(i * 8, i * 8 + 8);
            // 二进制数转为10进制
            iip[i] = Integer.toString(Integer.parseInt(s, 2));
        }

        return String.join(".", iip);
    }
}
